package com.zjsru.plan2024.oneday;

/**
 * 2375. 根据模式串构造最小数字
 *
 * @Author: cookLee
 * @Date: 2024-10-26
 */
public class SmallestNumber {

    /**
     * 主
     * \
     * 如果 pattern[i] == 'I' ，那么 num[i] < num[i + 1] 。
     * 如果 pattern[i] == 'D' ，那么 num[i] > num[i + 1] 。
     * \
     * 输入：pattern = "IIIDIDDD"
     * 输出："123549876"
     * 解释：
     * 下标 0 ，1 ，2 和 4 处，我们需要使 num[i] < num[i+1] 。
     * 下标 3 ，5 ，6 和 7 处，我们需要使 num[i] > num[i+1] 。
     * 一些可能的 num 的值为 "245639871" ，"135749862" 和 "123849765" 。
     * "123549876" 是满足条件最小的数字。
     * 注意，"123414321" 不是可行解因为数字 '1' 使用次数超过 1 次。
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        SmallestNumber smallestNumber = new SmallestNumber();
        String pattern = "IIIDIDDD";
        System.out.println(smallestNumber.smallestNumber(pattern));
    }

    /**
     * 最小数字
     *
     * @param pattern 图案
     * @return {@link String}
     */
    public String smallestNumber(String pattern) {
        int len = pattern.length();
        int index = 0;
        //初始化一个为0数组
        int[] count = new int[len + 1];
        int init = 1;
        while (index < len) {
            //index > 0 忽略第一位
            if (index > 0 && pattern.charAt(index) == 'I') {
                index++;
            }
            for (; index < len && pattern.charAt(index) == 'I'; index++) {
                count[index] = init++;
            }
            //记录D的坐标
            int indexD = index;
            //获取到当前段D的边界
            while (index < len && pattern.charAt(index) == 'D') {
                index++;
            }
            //从后往前累计数字
            for (int i = index; i >= indexD; i--) {
                count[i] = init++;
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int num : count) {
            sb.append(num);
        }
        return sb.toString();
    }
}
